home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Games / NeXTGo / Source / igssocket.m < prev    next >
Text File  |  1993-02-08  |  4KB  |  242 lines

  1. #include "comment.header"
  2.  
  3.  
  4. /*   This file was converted from the igs client written by Adrienne Mariano.  */
  5. #include <sys/types.h>
  6. #include <sys/time.h>
  7. #include <sys/socket.h>
  8. #include <netdb.h>
  9.  
  10. #ifndef WINS            /* Usually want this... */
  11. #include <netinet/in.h>
  12. #else                /* ... but need these for WINS. */
  13. #include <sys/in.h>
  14. #include <sys/inet.h>
  15. #endif
  16.  
  17. #include <fcntl.h>
  18. #include <sys/errno.h>
  19. #include <stdio.h>
  20. #ifndef FD_ZERO
  21. #include <sys/select.h>
  22. #endif
  23. #include "igs.h"
  24.  
  25. #import <appkit/appkit.h>
  26. #import "GoApp.h"
  27.  
  28. /* For some odd systems, which don't put this in errno.h. */
  29.  
  30. extern int errno;
  31.  
  32. char servename[80];        /* = "129.24.14.70"; *//* "lacerta.unm.edu"; */
  33. int serveport;            /* = 6969; */
  34. int sock;
  35. char inbuf[1000];
  36. int inptr = 0;
  37.  
  38.  
  39. void sethost(char *s)
  40. {
  41.   strcpy(servename, s);
  42. }
  43.  
  44.  
  45. void setport(int s)
  46. {
  47.   serveport = s;
  48. }
  49.  
  50. #ifdef DEBUG
  51. FILE *blah;
  52. #endif
  53.  
  54. extern void incomingserver();
  55. int writetosock;
  56.  
  57. int open_connection()
  58. {
  59.   struct sockaddr_in server;
  60.   struct hostent *hp;
  61.   int ipn;
  62.   char s[80];
  63.     
  64.   sprintf(s, "Opening connection to %s %d\n", servename, serveport);
  65.   [NXApp SetIGSStatus:s];
  66. #ifdef DEBUG
  67.   {
  68.     int d;
  69.     char n[444];
  70.     
  71.     d = 0;
  72.     do {
  73.       sprintf(n, "dump%d.igs", d);
  74.       blah = fopen(n, "r");
  75.       if (!blah) {
  76.     blah = fopen(n, "w");
  77.     if (blah)
  78.       printf("Creating dump file %s\n", n);
  79.     break;
  80.       }
  81.       fclose(blah);
  82.       d++;
  83.       if (d > 9) {
  84.     printf("Too many dump files.  Type 'rm dump?.igs' and try again.\n");
  85.     exit(1);
  86.       }
  87.     } while (1);
  88.     
  89.   }
  90. #endif
  91.   
  92.   if (sscanf(servename, "%d.%d.%d.%d", &ipn, &ipn, &ipn, &ipn) == 4)
  93.     server.sin_addr.s_addr = inet_addr(servename);
  94.   else {
  95.     hp = gethostbyname(servename);
  96.     if (hp == 0) {
  97.       puts("Unknown host");
  98.       return -1;
  99.     }
  100.     bcopy(hp->h_addr, &server.sin_addr, hp->h_length);
  101.   }
  102.   
  103.   server.sin_family = AF_INET;
  104.   server.sin_port = htons(serveport);
  105.   sock = socket(AF_INET, SOCK_STREAM, 0);
  106.   if (sock < 0) {
  107.     perror("socket");
  108.     return -1;
  109.   }
  110.   if (connect(sock, (struct sockaddr *) & server,
  111.           sizeof(struct sockaddr_in)) < 0) {
  112.     perror("connect");
  113.     return -1;
  114.   }
  115. /*  fcntl(sock, F_SETFL, FASYNC);
  116.   fcntl(sock, F_SETOWN, getpid());
  117.   signal(SIGIO, incomingserver);  */
  118.   writetosock = 0;
  119.   return 0;
  120. }
  121.  
  122. void sendstr(char *buf)
  123. {
  124.   write(sock, buf, strlen(buf));
  125. #ifdef DEBUG
  126.   fprintf(blah, ">%s<\n", buf);
  127.   fflush(blah);
  128. #endif
  129. }
  130.  
  131.  
  132. int eatchar = 0;
  133.  
  134.  
  135. /* struct timeval timeout = { 0L, 100000L }; */
  136.  
  137.  
  138.  
  139. int handlechar(char in)
  140. {
  141.   if (in == '\r')
  142.     return 0;
  143. #ifdef DEBUG
  144.   fputc(in, blah);
  145.   fflush(blah);
  146. #endif
  147.   if (eatchar) {
  148.     eatchar--;
  149.     return 0;
  150.   }
  151.   if (in == '\377') {
  152.     eatchar = 2;
  153.     return 0;
  154.   }
  155.   if (in == '\n') {
  156.     inbuf[inptr] = 0;
  157.     strcpy(retbuf, inbuf);
  158.     inptr = 0;
  159.     if (idle)
  160.       doserver();
  161.     return 1;
  162.   } else {
  163.     inbuf[inptr++] = in;
  164.     if (doneline(inbuf, inptr)) {
  165.       inbuf[inptr] = 0;
  166.       strcpy(retbuf, inbuf);
  167.       inptr = 0;
  168.       if (idle)
  169.     doserver();
  170.       return 1;
  171.     }
  172.   }
  173.  
  174.   return 0;
  175. }
  176.  
  177.  
  178.  
  179. int bufdata = 0, bufptr = 0;
  180. char thebuf[1000];
  181.  
  182.  
  183. void incomingserver()
  184. {
  185.   if (idle == 0)
  186.    {
  187. #ifdef DEBUG
  188.     fprintf(blah,"busy...\n");
  189.     fflush(blah);
  190. #endif
  191.     return;
  192.    }
  193.  
  194.   bufptr = 0;
  195.   bufdata = read(sock, thebuf, 1000);
  196.   while (bufdata)
  197.     {
  198.       bufdata--;
  199.       handlechar(thebuf[bufptr++]);
  200.     }
  201. }
  202.  
  203. int pollserver()
  204. {
  205.   int sel;
  206.   fd_set readers;
  207.  
  208.   FD_ZERO(&readers);
  209.   while (1)
  210.     {
  211.     while (bufdata)
  212.       {
  213.     bufdata--;
  214.     if (handlechar(thebuf[bufptr++]))
  215.       return 1;
  216.       }
  217.     bufptr = 0;
  218.     FD_SET(sock, &readers);
  219.     sel = select(sock + 1, &readers, NULL, NULL, (struct timeval *) 0);
  220.     if (sel == -1)
  221.       {
  222.     if (errno != EINTR)    /* ^Z will do this */
  223.       {
  224.         perror("select");
  225.         return -1;
  226.       }
  227.     continue;
  228.       }
  229.     if (FD_ISSET(sock, &readers))
  230.       {
  231.     bufdata = read(sock, thebuf, 1000);
  232.     if (!bufdata)
  233.       return -1;
  234.     if (bufdata < 0)
  235.       {
  236.         perror("read");
  237.         return -2;
  238.       }
  239.       }
  240.   }
  241. }
  242.